package net.ysen.tree.impl;

import java.util.List;

import net.ysen.tree.entitybean.TreeNode;

/**
 * 树抽象类 ，轻量级实现 客户端使用对象来构建树，服务端只需提供TreeBean格式的数据源即可。
 * 
 * @author Yangjianliang datetime 2009-4-23
 */
public abstract class YstreeLightImpl {

	public static final String lineSeparator = System.getProperty("line.separator");

	/**
	 * 生成树。客户端树对象句柄名称采用默认ystree，JS里的请保持相同名称。
	 * 
	 * @param list 数据源，会自动调用TreeBeanConvert方法格式化此数据为数对象数据。
	 *            所以务必先正确实现TreeBeanConvert方法！
	 * @return
	 */
	public String writeTree(List list, boolean showCheckBox) {
		return writeTree(list, true, "ystree", showCheckBox);
	}

	/**
	 * 生成树
	 * 
	 * @param list 数据源，会自动调用TreeBeanConvert方法格式化此数据为数对象数据。
	 *            所以务必先正确实现TreeBeanConvert方法！
	 * @param treeName 客户端树对象句柄名称（默认是ystree）
	 * @param responseNow
	 *            立即输出（默认是tree）。如果用户希望对生成的树修改后再展示，可以传入false，然后JS里调用document.write
	 *            (ystree);
	 * @param showCheckBox ajax树？true的话就不能是ajax的，因为角色分配保存不了
	 * @return
	 */
	public String writeTree(List list, boolean responseNow, String treeName, boolean showCheckBox) {
		if (treeName == null || treeName.equals("")) {
			treeName = "ystree";
		}
		List<TreeNode> treeNodes = treeBeanConversion(list);

		StringBuffer sb = new StringBuffer("<div id=\"ystreeDiv\" class=\"ystree\"></div>").append(lineSeparator);
		sb.append("<script type=\"text/javascript\">").append(lineSeparator);
		sb.append("function writeTreeCode(){").append(lineSeparator);
		sb.append("    document.getElementById(\"ystreeDiv\").innerHTML = ").append(treeName).append(";").append(
				lineSeparator);
		sb.append("}").append(lineSeparator);
		// sb.append("function makeWholeYsTree(){").append(lineSeparator);

		for (int i = 0; i < treeNodes.size(); i++) {
			TreeNode treeNode = treeNodes.get(i);
			// ystree.add(id, pid, name, checkboxValue, openNode, url, title,
			// target, icon, iconOpen);
			sb.append(treeName).append(".add(").append("'").append(treeNode.getId()).append("', ").append("'").append(
					treeNode.getParentid() == null ? "" : treeNode.getParentid()).append("', ").append("'").append(
					treeNode.getText()).append("', ").append("'").append(
					treeNode.getValue() != null ? treeNode.getValue() : "").append("', ").append(
					treeNode.getChildCount() == 0).append(");").append(lineSeparator);
			if (treeNode.getChildCount() != 0) { // 有子节点存在时才创建空子节点
				// 默认为每个一级菜单添加一个子节点.
				if (!showCheckBox && treeNode.getParentid() != null && treeNode.getParentid().trim().length() > 0) {// 非根节点。根节点上级一般是空或者0
					sb.append(treeName).append(".add('").append(i + "','").append(treeNode.getId() + "','加载中','')");
					sb.append(lineSeparator);
				}
			}
		}
		// sb.append("}").append(lineSeparator);
		if (responseNow) {
			// sb.append("document.write(").append(treeName).append(");").append(lineSeparator);
			sb.append("window.onload = writeTreeCode;").append(lineSeparator);
		}
		sb.append("</script>").append(lineSeparator);
		return sb.toString();
	}

	/**
	 * 把查询出的数据转化为TreeBean对象。
	 * 
	 * @param list
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<TreeNode> treeBeanConversion(List list) {
		return list;
	};

}
